// let target = {}
// let source = {
//   a: 1,
//   b: 2,
// }

// Object.assign(target, source)
// console.log(target);

// !object.assign 对引用类型复制时,是直接拷贝地址 只是浅拷贝

// 当赋值并且修改值时,2个对象互不影响,则称为深拷贝
// JSON javascript object notation  
// JSON.parse 字符串转化为对象
// JSON.stringify 对象转化为字符串
// JSON.Parse(JSON.stringify(obj)) //! 为深拷贝 但是有缺点


const data = {
  a: 1,
  b: {
    c: 2,
    d: 3
  },
  e() {
    console.log(111);
  }
}
// typeof 只能判断基础数据类型
const checkType =  data =>  Object.prototype.toString.call(data).slice(8, -1)
console.log(checkType(data)); 
let deepClone = target => {
  let targetType = checkType(target)
  let result
  if(targetType === 'Object') {
    result = {}
  } else if(targetType === 'Array') {
    result = []
  } else {
    return target
  }
  for(let key in target) {
    let value = target[key]
    let valueType = checkType(value)
    if(valueType === 'Object' || valueType === 'Array') {
      result[key] = deepClone(value)
    } else {
      result[key] = value
    }
  }
  return result
}

let arr1 = [1,2, {age: 18}]
let arr2 = deepClone(arr1)
arr2[2].age = 100
console.log(arr1);